home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / prg_casm / recio215.zip / RGETS.C < prev    next >
C/C++ Source or Header  |  1996-10-26  |  6KB  |  146 lines

  1. /*****************************************************************************
  2.    MODULE: rgets.c
  3.   PURPOSE: recio character delimited string and char input functions
  4. COPYRIGHT: (C) 1994-1996, William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.15
  8.   RELEASE: October 26, 1996
  9. *****************************************************************************/
  10.  
  11. #include <ctype.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15.  
  16. #include "recio.h"
  17.  
  18. extern int _risready(REC *rp, int mode);
  19. extern char *_rfldstr(REC *rp, size_t len);
  20. extern char *_rerrs(REC *rp, int errnum);
  21.  
  22. #define rflags(rp)       ((rp)->r_flags)
  23. #define rcol(rp)         ((rp)->r_colno)
  24. #define rreclen(rp)      ((rp)->r_reclen)
  25.  
  26. /****************************************************************************/
  27. int                          /* return character; EOF=error or missing data */
  28.     str2c(                   /* convert string to character                 */
  29.         const char  *nptr,   /* pointer to string to convert                */
  30.               char **endptr) /* pointer to conversion leftover string       */
  31. /****************************************************************************/
  32. {
  33.     int ch=EOF;              /* result to return */
  34.  
  35.     /* set *endptr to nptr just in case conversion fails */
  36.     if (endptr) *endptr = (char *) nptr;
  37.  
  38.     /* skip over white space */
  39.     while (isspace(*nptr)) nptr++;
  40.     
  41.     /* if string contains a non-whitespace character */
  42.     if (*nptr != '\0') {
  43.         
  44.         /* get the character */
  45.         ch = (int) *nptr;
  46.         
  47.         /* position endptr just past the character */
  48.         if (endptr) *endptr = (char *) ++nptr;
  49.     } 
  50.     return ch;
  51. }
  52.  
  53. /****************************************************************************/
  54. int                          /* return pointer to char; EOF on error        */
  55.     rgetc(                   /* get character from record stream            */
  56.         REC *rp)             /* record pointer                              */
  57. /****************************************************************************/
  58. {
  59.     int result=EOF;          /* character to return */
  60.     int ch;                  /* conversion character */
  61.     char *fldptr;            /* pointer to field string */
  62.     char *endptr;            /* pointer to first invalid field char */
  63.  
  64.     if (_risready(rp, R_READ)) {
  65.       fldptr = _rfldstr(rp, 0);
  66.       if (fldptr) {
  67.         strims(fldptr);
  68.         for (;;) {
  69.           if (*fldptr != '\0') {
  70.             endptr = fldptr;
  71.             ch = str2c(fldptr, &endptr);
  72.             while (isspace(*endptr)) endptr++;
  73.             if (!*endptr) {
  74.                 result = ch;
  75.                 goto done;
  76.             } /* invalid data (more than 1 character in field) */
  77.             fldptr = _rerrs(rp, R_EINVDAT);
  78.             if (fldptr) { continue; } else { goto done; }
  79.           } /* missing data (nothing but white space) */
  80.           fldptr = _rerrs(rp, R_EMISDAT);
  81.           if (fldptr) { continue; } else { goto done; }
  82.         }
  83.       }
  84.     }
  85. done:
  86.     return result;
  87. }
  88.  
  89. /****************************************************************************/
  90. int                          /* return pointer to char; EOF on error        */
  91.     rngetc(                  /* get character from field number             */
  92.         REC *rp,             /* record pointer                              */
  93.         unsigned num)        /* field number                                */
  94. /****************************************************************************/
  95. {
  96.     rgotofld(rp, num);
  97.     return rgetc(rp);
  98. }
  99.  
  100. /****************************************************************************/
  101. char *                       /* return pointer to string; "" on error       */
  102.     rgets(                   /* get string from record stream               */
  103.         REC *rp)             /* record pointer                              */
  104. /****************************************************************************/
  105. {
  106.     static char empty[]="";  /* empty string */
  107.     char *retp=empty;        /* return pointer */
  108.     char *fldptr;            /* pointer to field buffer */
  109.  
  110.     if (_risready(rp, R_READ)) {
  111.  
  112.         /* if field position is within record */
  113.         if (rcol(rp) <= rreclen(rp)) {
  114.             fldptr = _rfldstr(rp, 0);
  115.             if (fldptr) {
  116.                 /* if string not empty */
  117.                 if (*fldptr) {
  118.                     retp = fldptr;
  119.                 } else {
  120.                     rsetwarn(rp, R_WEMPSTR);
  121.                     retp = rflds(rp);
  122.                 }
  123.             }
  124.  
  125.         /* else beyond end of record */
  126.         } else {
  127.             rfldno(rp)++;
  128.             rsetfldstr(rp, "");
  129.             rsetwarn(rp, R_WEMPSTR);
  130.             retp = rflds(rp);
  131.         }
  132.     }
  133.     return retp;
  134. }
  135.  
  136. /****************************************************************************/
  137. char *                       /* return pointer to string; "" on error       */
  138.     rngets(                  /* get string from field number                */
  139.         REC *rp,             /* record pointer                              */
  140.         unsigned num)        /* field number                                */
  141. /****************************************************************************/
  142. {
  143.     rgotofld(rp, num);
  144.     return rgets(rp);
  145. }
  146.